package cn.test.future.cs;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * 类似 Dubbo 的 Forking Cluster场景
 * <p>
 * Dubbo 中有一种叫做 Forking 的集群模式，这种集群模式下，支持并行地调用多个服务实例，只要有一个成功就返回结果。
 */
/*public class CompletionServiceTest2 {
    public static void main(String[] args) {

    }

    String geocoder(int arg) {
        // 并行执行以下3个查询服务
        String r1 = geocoderByS1(arg);
        String r2 = geocoderByS2(arg);
        String r3 = geocoderByS3(arg);

        // 只要r1 r2 r3有一个返回，就返回
        return r1 | r2 | r3;
    }

    String geocoder2(int arg) throws InterruptedException, ExecutionException {
        // 创建线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);

        // 创建CompletionService
        CompletionService<String> cs = new ExecutorCompletionService<>(executor);

        // 用于保存future对象
        List<Future<String>> list = new ArrayList<>(3);

        // 提交异步任务，并保存future到List
        list.add(cs.submit(() -> geocoderByS1(arg)));
        list.add(cs.submit(() -> geocoderByS2(arg)));
        list.add(cs.submit(() -> geocoderByS3(arg)));

        String result = null;
        try {
            // 只要有一个成功返回，则break
            for (int i = 0; i < 3; i++) {
                result = cs.take().get();
                // 简单的通过判空来检查是否成功返回
                if (result != null) {
                    break;
                }
            }
        } finally {
            // 取消所有任务
            for (Future<String> stringFuture : list) {
                stringFuture.cancel(true);
            }
        }

        return result;
    }
}*/
